/*!
 * @file areaSquare.hh
 * @brief Blok terenu
 */

#ifndef __MODES_WORLD_AREA_AREABLOCK_HH
#define __MODES_WORLD_AREA_AREABLOCK_HH

#include <string>
#include <cmath>
#include "engine/pawirr.hh"
#include "engine/basic/shader.hh"

/*!
 * @brief Obiekt reprezentujący 1 blok o boku 1024.
 */
class areaSquare {
public:
	/*!
	 * @brief Konstruktor. Generuje puste VAO i VBO
	 * @return
	 */
	areaSquare(int startx, int starty, int stopx, int stopy, float *heightmap,
			int totalX, int totalY, bool isMainContent);

	/*!
	 * @brief Malowanie kawałka terenu z quadtree
	 */
	void draw(int maxDetails, bool useShader, point2f translate = point2f(0.0f, 0.0f));

private:
	point2f translation;

	point2f centerOfSquare;

	areaSquare *terrA, *terrB, *terrC, *terrD;

	const bool allowQuadTree;

	int lod;
	const int startx, stopx;
	const int starty, stopy;

	/*!
	 * @brief Długość boku
	 */
	const int ssidex;
	const int ssidey;
	/*!
	 * @brief Wskaźnik na mapę wysokości
	 */
	float *heightmap;

	/*!
	 * @brief Całkowita szerokość świata
	 */
	const int totalX;

	/*!
	 * @brief Całkowita długość świata
	 */
	const int totalY;

	/*!
	 * @brief VAO
	 */
	GLuint vao;

	/*!
	 * @brief VBO
	 */
	GLuint vbo[3];

	/*!
	 * @brief Ilość wierzchołków
	 */
	const long int vertexCount;

	/*!
	 * @brief shader terenu
	 */
	shader *terrainShader;

	/*!
	 * @brief Wypełnianie wierzchołków
	 * @param id Identyfikator w VAO
	 */
	void fillVerticles(int id);

	/*!
	 * @brief Wypełnianie wektorów normalnych
	 * @param id Identyfikator w VAO
	 */
	void fillNormals(int id);

	/*!
	 * @brief Wypełnianie położenia tekstury
	 * @param id Identyfikator w VAO
	 */
	void fillTexcoords(int id);

};

#else
class areaSquare;
#endif
